home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / network / file-tra / fsp-2.7 / fsp-2 / fsp / bsd_src / option.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-05-07  |  3.9 KB  |  131 lines

  1. /*-
  2.  * Copyright (c) 1990 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * Cimarron D. Taylor of the University of California, Berkeley.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *    This product includes software developed by the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  */
  36.  
  37. #include "tweak.h"
  38. #ifndef VMS
  39. #include <sys/types.h>
  40. #include <sys/stat.h>
  41. #else
  42. #include "types.h"
  43. #include "stat.h"
  44. #endif
  45. #include <stdio.h>
  46. #ifdef HAVE_UNISTD_H
  47. #include <unistd.h>
  48. #endif
  49. #include "my-string.h"
  50. #include "find.h"
  51.  
  52. OPTION options[] = {
  53.   "!",        N_NOT,        c_not,        O_ZERO,
  54.   "(",        N_OPENPAREN,    c_openparen,    O_ZERO,
  55.   ")",        N_CLOSEPAREN,    c_closeparen,    O_ZERO,
  56.   "-a",        N_AND,        NULL,        O_NONE,
  57.   "-and",    N_AND,        NULL,        O_NONE,
  58.   "-exec",    N_EXEC,        c_exec,        O_ARGVP,
  59.   "-ls",    N_LS,        c_ls,        O_ZERO,
  60.   "-name",    N_NAME,        c_name,        O_ARGV,
  61.   "-newer",    N_NEWER,    c_newer,    O_ARGV,
  62.   "-o",        N_OR,        c_or,        O_ZERO,
  63.   "-ok",    N_OK,        c_exec,        O_ARGVP,
  64.   "-or",    N_OR,        c_or,        O_ZERO,
  65.   "-print",    N_PRINT,    c_print,    O_ZERO,
  66.   "-prune",    N_PRUNE,    c_prune,    O_ZERO,
  67.   "-size",    N_SIZE,        c_size,        O_ARGV,
  68.   "-time",    N_TIME,        c_time,        O_ARGV,
  69.   "-type",    N_TYPE,        c_type,        O_ARGV,
  70. };
  71.  
  72. /*
  73.  * find_create --
  74.  *    create a node corresponding to a command line argument.
  75.  *
  76.  * TODO:
  77.  *    add create/process function pointers to node, so we can skip
  78.  *    this switch stuff.
  79.  */
  80. PLAN *find_create PROTO1(char ***, argvp)
  81. {
  82.   register OPTION *p;
  83.   PLAN *new;
  84.   char **argv;
  85.   OPTION *option();
  86.   
  87.   argv = *argvp;
  88.   
  89.   if ((p = option(*argv)) == NULL) {
  90.     (void)fprintf(stderr, "find: unknown option %s.\n", *argv);
  91.     exit(1);
  92.   }
  93.   ++argv;
  94.   if (p->flags & (O_ARGV|O_ARGVP) && !*argv) {
  95.     (void)fprintf(stderr, "find: %s requires additional arguments.\n",
  96.           *--argv);
  97.     exit(1);
  98.   }
  99.   
  100.   switch(p->flags) {
  101.     case O_NONE:
  102.       new = NULL;
  103.       break;
  104.     case O_ZERO:
  105.       new = (p->create)();
  106.       break;
  107.     case O_ARGV:
  108.       new = (p->create)(*argv++);
  109.       break;
  110.     case O_ARGVP:
  111.       new = (p->create)(&argv, p->token == N_OK);
  112.       break;
  113.   }
  114.   *argvp = argv;
  115.   return(new);
  116. }
  117.  
  118. static int typecompare PROTO2(char *, a, char *, b)
  119. {
  120.   return(strcmp(((OPTION *)a)->name, ((OPTION *)b)->name));
  121. }
  122.  
  123. OPTION *option PROTO1(char *, name)
  124. {
  125.   OPTION tmp;
  126.   
  127.   tmp.name = name;
  128.   return((OPTION *)bsearch(&tmp, options, sizeof(options)/sizeof(OPTION),
  129.                sizeof(OPTION), typecompare));
  130. }
  131.